package com.coderysh.rabbitmq.model.directconnection;

import com.coderysh.rabbitmq.util.RabbitmqUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author 姚书恒
 * @version 1.0
 * @email yaoshuheng@zjkeyou.com
 * @date 2021-10-26 14:05:05
 * @description: 生产者
 */
public class Provider {
    /**
     * 通过连接获取通道
     *
     * @param channel
     * @param message
     */
    public void productionMessage(Channel channel, String message) {
        // 通道绑定对应的消息队列
        // 参数1：队列名称，不存在时会自动创建
        // 参数2：定义队列的特性，是否要持久化，true代表持久化（当mq服务关闭时，会存到磁盘中，下次重启会不会丢失）队列，false代表不持久化
        // 参数3：是否独占队列，true代表独占队列，相对于本次连接而言，为true则只能通过本次连接进行操作；false代表不独占，可被其他连接操作
        // 参数4：是否在消费完成后自动删除队列，true 自动删除，false不自动删除
        // 参数5：额外付加参数
        try {
            channel.queueDeclare("hello", false, false, false, null);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 发布消息
        // 参数1：交换机名称，没有可以不设置
        // 参数2：队列名称
        // 参数3：传递消息的额外设置
        // 参数4：消息的具体内容
        try {
            channel.basicPublish("", "hello", null, message.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        Connection connection = channel.getConnection();
        // 关闭通道
        RabbitmqUtil.closeChannel(channel);

        // 关闭连接
        RabbitmqUtil.closeConnection(connection);
    }

    /**
     * 生产者生产消息
     */
    public void sendMessage(String message) {
        System.out.println("正在发送内容:" + message);
        this.productionMessage(RabbitmqUtil.createChannel(RabbitmqUtil.connection()), message);
        System.out.println("发送内容完成:" + message);
    }

    public static void main(String[] args) {
        Provider provider = new Provider();
        for (int i = 0; i < 1000; i++) {
            provider.sendMessage("hello rabbitmq : " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
